package com.ypf.accesslimit.controller;

import com.ypf.accesslimit.limit.AccessLimiter;
import com.ypf.accesslimit.limit.Limit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("access")
@CrossOrigin
public class AccessLimitController {

    @Autowired
    private AccessLimiter accessLimiter;

    /**
     * 限制接口测试
     * @return
     */
    @GetMapping ("/test/limit")
      @Limit
      public String testAccessLimit(){
          return "hello world";
      }

    /**
     * 添加一条新的接口限流规则（接口名称写死 如有需要可以从请求路径中获取）
     */
    @GetMapping("/add")
      public void addAccessLimit(){
          String redisKey = "interfaceIsLimit:TestLimit";

          // 默认是秒 可以通过将传入 ms s min hour 用判断语句改为 TimeUnit.SECONDS
          TimeUnit unit = TimeUnit.SECONDS;
          HashMap<String,Object> map = new HashMap<>();
          map.put("times","10");
          map.put("per","10");
          map.put("unit",unit);
          accessLimiter.addLimitInfo(redisKey,map);
      }

    /**
     * 查询某接口限流规则（接口名称写死 如有需要可以从请求路径中获取）
     * @return
     */
    @GetMapping("/get")
    public HashMap getAccessLimit(){
          String redisKey = "interfaceIsLimit:TestLimit";
          HashMap map = accessLimiter.getLimitInfo(redisKey);
          return map;
      }

    /**
     * 更新某一接口限流规则
     * @param redisKey
     * @param times
     * @param per
     */
      @GetMapping("/update/{redisKey}/{times}/{per}")
    public void updateAccessLimit(@PathVariable String redisKey,@PathVariable String times,@PathVariable String per){
          // 默认是秒 可以通过将传入 ms s min hour 用判断语句改为 TimeUnit.SECONDS
          TimeUnit unit = TimeUnit.SECONDS;
          HashMap<String,Object> map = new HashMap<>();
          map.put("times",times);
          map.put("per",per);
          map.put("unit",unit);
          // 先删除后更新 (应该可以写lua脚本去实现这个功能会更好 只需要访问一次redis 而且操作是原子性的)
          accessLimiter.deleteLimited(redisKey);
          accessLimiter.addLimitInfo(redisKey,map);
      }

    /**
     * 删除某一接口限流规则
     * @param redisKey
     */
      @GetMapping("delete/{redisKey}")
    public void deleteAccessLimit(@PathVariable String redisKey){
          accessLimiter.deleteLimited(redisKey);
      }
}
